import time
import requests
import json


class MyPay(object):
    def __init__(self):
        self.out_trade_no = None

    def isorder(self,order):
        if order[0] == "1":
            return self.WeChat_pay
        elif order[0] == "2":
            return self.Alipay_pay

    def WeChat_pay(self,mony,order): # 微信支付
        url = "https://api.mch.weixin.qq.com/pay/micropay"
        appid = ''                                            # 公众账号ID
        mch_id = ''                                           # 商户号
        nonce_str = ''                                        # 随机字符串
        sign = ''                                             # 签名
        body = '.....'                                        # 商品描述 
        self.out_trade_no = time.strftime("%Y%m%d%H%M%S")     # 商户订单号
        total_fee = int(mony)                                 # 订单金额
        spbill_create_ip = ''                                 # 终端IP
        auth_code = order                                     # 付款码
        data="<xml>\
                   <appid>{}</appid>\
                   <auth_code>{}</auth_code>\
                   <body>{}</body>\
                   <mch_id>{}</mch_id>\
                   <nonce_str>{}</nonce_str>\
                   <out_trade_no>{}</out_trade_no>\
                   <spbill_create_ip>{}</spbill_create_ip>\
                   <total_fee>{}</total_fee>\
                   <sign>{}</sign>\
              </xml>".format(appid,auth_code,body,mch_id,nonce_str,self.out_trade_no,spbill_create_ip,total_fee,sign)
        return self.http_get((url,data),'wx')

    def Alipay_pay(self,mony,order): # 支付宝支付
        timestamp = time.strftime("%Y-%m-%d %H:%M:%S")        # 发送请求的时间
        method = 'alipay.trade.pay'                           # 接口名称
        app_id = ''                                           # 支付宝分配给开发者的应用ID
        sign_type='RSA'                                       # 商户生成签名字符串所使用的签名算法类型
        sign = ''                                             # 商户请求参数的签名串
        version = '1.0'                                       # 调用的接口版本，固定为：1.0
        charset = 'utf-8'                                     # 请求使用的编码格式
        self.out_trade_no = time.strftime("%Y%m%d%H%M%S")     # 订单号
        subject = ''                                          # 订单标题
        scene = 'bar_code'                                    # 支付场景
        auth_code = order                                     # 付款条形码
        total_amount = mony                                   # 订单金额
        product_code = ''                                     # 产品码
        url = "https://openapi.alipay.com/gateway.do?timestamp={}&method={}&app_id={}&sign_type={}&sign={}&version={}&charset={}&biz_content=out_trade_no={}&subject={}&scene={}&auth_code={}&total_amount={}&product_code={}".format(timestamp,method,app_id,sign_type,sign,version,charset,self.out_trade_no,subject,scene,auth_code,total_amount,product_code)
        return self.http_get(url,'zfb')

    def WeChat_refund(self,ref,mony): # 微信退款
        url = "https://api.mch.weixin.qq.com/secapi/pay/refund"
        appid = ''                                            # 公众账号ID
        mch_id = ''                                           # 商户号
        nonce_str = ''                                        # 随机字符串
        sign = ''                                             # 签名
        out_trade_no = self.out_trade_no                      # 商户订单号
        out_refund_no = ''                                    # 商户退款单号
        total_fee = int(mony)                                 # 订单金额 
        refund_fee = int(ref)                                 # 退款金额
        data="<xml>\
                  <appid>{}</appid>\
                  <mch_id>{}</mch_id>\
                  <nonce_str>{}</nonce_str>\
                  <out_refund_no>{}</out_refund_no>\
                  <out_trade_no>{}</out_trade_no>\
                  <refund_fee>{}</refund_fee>\
                  <total_fee>{}</total_fee>\
                  <sign>{}</sign>\
              </xml>".format(appid,mch_id,nonce_str,out_refund_no,out_trade_no,refund_fee,total_fee,sign)
        return self.http_get((url,data),'wx')

    def Alipay_refund(self,ref): # 支付宝退款
        timestamp = time.strftime("%Y-%m-%d %H:%M:%S")        # 发送请求的时间
        out_trade_no = self.out_trade_no                      # 退款单号
        app_id = ""                                           # 支付宝分配给开发者的应用ID
        charset = "utf-8"                                     # 请求使用的编码格式
        method = "alipay.trade.refund"                        # 接口名称
        sign_type = "RSA"                                     # 商户生成签名字符串所使用的签名算法类型
        sign = ""                                             # 商户请求参数的签名串
        version = "1.0"                                       # 调用的接口版本，固定为：1.0
        refund_amount = ref                                   # 退款金额
        url = "https://openapi.alipay.com/gateway.do?timestamp={}&method={}&app_id={}&sign_type={}&sign={}&version={}&charset={}&biz_content=out_trade_no={}&refund_amount={}".format(timestamp,method,app_id,sign_type,sign,version,charset,out_trade_no,refund_amount)
        return self.http_get(url,'zfb')

    def http_get(self,url,a):
        if a == 'zfb': 
            m = requests.get(url)
            if m.status_code == 200:
                jstxt = json.loads(m.text)
                if jstxt['alipay_trade_pay_response']['code'] == '10000':
                    if jstxt["msg"] == "Success":
                        return self.out_trade_no
                else:
                    return self.out_trade_no

            else:
                self.http_get(url,a)
        elif a == 'wx':
            m = requests.post(url=url[0],data=url[1])
            if m.status_code == 200:
                return self.out_trade_no
            else:
                self.http_get(url,a)


mypay = MyPay()

